#include <stdbool.h>
#include <stdio.h>
#include "tabooExpire.h"

#ifndef ALGCONFIGURATION_H_
#define ALGCONFIGURATION_H_

/*TODO Pat ha pensato ad una struttura a livelli in cui anche le configurazioni non sono sullo stesso
 * piano ma in strutture annidate. Rimodellare ALGCOnfiguration in modo che contenga solo i dati necessari per l'algoritmo in generale e
 * poi possieda i punrtatori per raggiungere LTMConfiguration, STMConfiguration e LOSConfiguration
 */

/**indica una struttura contenente tutti i parametri di configurazione
 * dell'algoritmo ALG. Tale struttura puo' essere passata ad un configparser
 * che provvede a riempirla con i valori contenuti in un file  */

typedef struct ALGConfiguration {
	//TODO qui poi andra' che i grafi possono essere pescati solo in benchmards/instances/
	/**indica il nome del file che contiene il grafo da analizzare*/
	char* graphPath;
	/**indica il numero di camion da utilizzare per questa analisi. chiamato K ovunque nell'algoritmo.*/
	int vehicleNumber;
	/**indica il nome dell'immagine bitmap che l'algoritmo puo' opzionalmente creare in fase costruttiva.
	 * Questa stringa deve contenere obbligatoriamente l'estensione".bmp".*/
	char* constructiveDrawingPath;
	/**se impostato a TRUE l'algoritmo disegna ogni singola iterazione STM ottenuta. <b>Attenzione</b> questa azione
	 * rallenta enormemente l'algoritmo!*/
	bool drawSolutionBMP;
	/**se impostato a TRUE l'algoritmo genera dei file .m che possono essere analizzati con strumenti come
	 * MATLAB o Octave. In questo modo poi lo storico STM puo' essere facilmente plottato.*/
	bool drawSolutionOctave;
	/**indica che valutazione usare nelle mosse tra PURE, SMART e WISE. si faccia riferimento ai valori delle macro */
	int evaluate;
	/**indica il numero massimo di iterazioni che possono essere effettuate in un unica risoluzione STM*/
	TabooExpire maximumLOSIterationNumber;
	/**indica il numero massimo di iterazioni accettate con peggioramento di soluzione in STM prima di terminare
	 * STM stessa*/
	TabooExpire maximumLOSWorseningIterationNumber;
	/**indica il numero di volte che STM deve essere richiamata dal livello LTM*/
	int maximumSTMIterationNumber;
	/**indica la tenure da associare ad un arco che entra in soluzione*/
	int addEdgeTenure;
	/**indica la tenure da associare ad un arco che esce dalla soluzione*/
	int removeEdgeTenure;
} ALGConfiguration;

/**puntatore ad una struttura ALGConfiguration localizzata in memoria*/
typedef ALGConfiguration* PalgConfiguration;

/**inizializza una nuova struttura di configurazione per ALG. Tutti i campi vengono impostati
 * a zero oppure a NULL (in caso di puntatori)
 *
 * \post
 *  \li una nuova struttura da deallocare <b>manualmente</b> viene allocata in memoria
 *
 * @return un puntatore alla nuova istanza ALGConfiguration
 */
PalgConfiguration initAlgConfiguration();

/**dealloca una struttura ALGCOnfiguration dalla memoria.
 *
 * \pre
 *  \li obj non NULL
 * \post
 *  \li l'area di memoria puntata da obj e' libera
 *  \li le aree di memoria puntate dai char* all'interno di questa stringa vengono liberate
 *
 * @param obj la struttura da deallocare
 */
void freeAlgConfiguration(PalgConfiguration obj);

/**stampa su file la configurazione di ALG
 *
 * \pre
 *  \li f aperto in scrittura
 *  \li obj non NULL
 *
 * @param f il file su cui stampare
 * @param obj l'oggetto da stampare
 */
void printAlgConfiguration(FILE* f,PalgConfiguration obj);

#endif /* ALGCONFIGURATION_H_ */
